package part02_单例模式;

/**静态内部类
 * 线程安全，同步方法
 * @ClassName: SingletonTest02
 * @Author: AllenSun
 * @Date: 2019/12/4 21:41
 */
public class SingletonTest06 {
    public static void main(String[] args) {
        //优缺点跟之前一样，浪费内存
        Singleton06 instance01=Singleton06.getInstance();
        Singleton06 instance02=Singleton06.getInstance();
        System.out.println(instance01==instance02);
        System.out.println("instance01-hashCode="+instance01.hashCode());
        System.out.println("instance02-hashCode="+instance02.hashCode());
    }
}

/**静态内部类完成，推荐使用
 * 1-这种方式采用类装载的机制来保证初始化实例时只有一个线程
 * 2-静态内部类方式在Singleton06类被装载时并不会立即实例化，而是在需要实例化时，才调用getInstance方法
 * 3-类的静态属性只会在第一次加载类的时候初始化，所以在这里，JVM帮助我们保证了线程的安全性，在类进行初始化的时候，别的线程是无法进入的
 *
 * 优点：避免了线程不安全，利用静态内部类特点实现延迟加载，效率高
 * 推荐使用
 * @MethodName:
 * @Author: AllenSun
 * @Date: 2019/12/4 21:58
 */
class Singleton06{
    //1-构造器私有化
    private Singleton06(){ }
    //2-本类内部创建对象实例
    private static volatile Singleton06 instance;
    //3-写一个静态内部类，该类中有一个静态属性
    private static class SingletonInstance{
        private static final Singleton06 INSTANCE=new Singleton06();
    }
    //4-提供一个静态的公有方法，直接返回SingletonInstance.INSTANCE
    public static synchronized Singleton06 getInstance(){
        return SingletonInstance.INSTANCE;
    }
}